/*******************************************************************************
  * 文件：TM1637.c
  * 作者：https://blog.csdn.net/wanglong3713
  * 版本：v1.0
  * 日期：2021-11-2
  * 说明：TM1637驱动
*******************************************************************************/

#include "tm1637.h"

//段码表
const uint8_t u8NumTab[] = 
{
	//0,	1,	2,	3,	4,	   5,	6,   7,  8,   9,    A,   b,  C,   d,   E,   F,  	
	0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
	//0., 1.,	2.,	3.,	 4.,  5.,   6.,  7.,  8.,  9. Null
	0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x00
};
//最左至最右数码管 ，依次为0-3号，对应的显示寄存器地址
const uint8_t u8TubeAddrTab[] = 
{
	0xC0,0xC1,0xC2,0xC3
};

void TM1637_Init(int sda,int clk){
  IIC_SetPort(sda,clk);

  IoTGpioInit(sda);
  IoTGpioSetFunc(sda,0);

  
  IoTGpioInit(clk);
  IoTGpioSetFunc(clk,0);
}
/*******************************************************************************
  * 函数名：TM1637_WriteCmd
  * 功  能：写命令
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void TM1637_WriteCmd(uint8_t u8Cmd)
{
	IIC_Start();
	IIC_WriteByte(u8Cmd);
	IIC_Ack();
	IIC_Stop();
}
/*******************************************************************************
  * 函数名：TM1637_WriteData
  * 功  能：向地址中写入数据
  * 参  数：u8Addr地址，u8Data数据
  * 返回值：无
  * 说  明：用于数码管固定地址写入显示数据
*******************************************************************************/
void TM1637_WriteData(uint8_t u8Addr, uint8_t u8Data)
{
	IIC_Start();
	IIC_WriteByte(u8Addr);
	IIC_Ack();
	IIC_WriteByte(u8Data);
	IIC_Ack();
	IIC_Stop();
}
/*******************************************************************************
  * 函数名：TM1637_TubeDisplay
  * 功  能：4个数码管显示
  * 参  数：sData显示数据结构体
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void TM1637_TubeDisplay(TM1637Tube_ts sData)
{
	uint8_t temp[4], i;
	temp[0] = u8NumTab[sData.tube0];
	temp[1] = u8NumTab[sData.tube1];
	temp[2] = u8NumTab[sData.tube2];
	temp[3] = u8NumTab[sData.tube3];
	for (i = 0; i < 4; i++)
	{
		TM1637_WriteData(u8TubeAddrTab[i], temp[i]);
	}
}
/*******************************************************************************
  * 函数名：TM1637_SetBrightness
  * 功  能：设置亮度
  * 参  数：u8Brt亮度
  * 返回值：无
  * 说  明：0x88为开显示
*******************************************************************************/
void  TM1637_SetBrightness(uint8_t u8Brt)
{
	TM1637_WriteCmd(0x88 | u8Brt);
}
/*******************************************************************************
  * 函数名：TM1637_Switch
  * 功  能：显示开关
  * 参  数：0关，1开
  * 返回值：无
  * 说  明：0x88为开显示，0x80关显示
*******************************************************************************/
void  TM1637_Switch(int bState)
{
	bState ? TM1637_WriteCmd(0x88) : TM1637_WriteCmd(0x80);
}